// 导入sequelize内置的数据类型，这些数据类型对应数据库的表里的不同类型
const { DataTypes } = require("sequelize");
// 导入数据库连接
const seq = require("../db/seq");
const Goods = require("./goods.model");

// 定义模型（设计表）
const Cart = seq.define(
  "zd_carts",
  {
    user_id: {
      type: DataTypes.INTEGER,
      allowNull: false,
      comment: "用户id",
    },
    goods_id: {
      type: DataTypes.INTEGER,
      allowNull: false,
      comment: "商品id",
    },
    number: {
      type: DataTypes.INTEGER,
      allowNull: false,
      defaultValue: 1, // 第一次添加到购物车时数量是一个
      comment: "商品的数量",
    },
    selected: {
      type: DataTypes.BOOLEAN,
      allowNull: false,
      defaultValue: true, // 将商品加入到购物车就是选中的状态
      comment: "是否选中",
    },
  },
  {
    /**
     * 表名配置：强制指定表名称
     * 若不设置，Sequelize默认会将模型名复数化作为表名（如模型名'user'会对应表名'users'）
     */
    tableName: "zd_carts",
    /**
     * 是否自动创建 createdAt(创建时刻的时间戳) 和 updatedAt(最新更新的时间戳) 字段，默认值为true。
     * 如果需要自定义这两个字段的名称，可以通过createdAt和updatedAt配置（如createdAt: 'create_time'）。
     */
    timestamps: true,
  },
);

// 同步模型（建表，代码执行后自动创建表）
// Cart.sync({
//   force: true,
// });

/**
 * zd_carts表关联zd_goods表
 * 使用belongsTo表示"购物车项属于某个商品"的关系
 * 会将zd_carts表中的goods_id字段作为外键，关联到zd_goods表的主键(id)
 *
 * 关联表中belongsTo和hasX的区分原则：
 * 1. 当当前表（zd_carts）中存在外键（goods_id）指向目标表（zd_goods）的主键时，用belongsTo
 *    例如：Cart.belongsTo(Goods) → 购物车项属于某个商品
 *
 * 2. 当目标表中存在外键指向当前表的主键时，根据关系cardinality（关系基数）选择：
 *  - 若为"一对一"（一个商品只能有一个购物车项），用hasOne
 *    例如：Goods.hasOne(Cart) → 商品拥有一个购物车项（此场景不常用）
 *  - 若为"一对多"（一个商品可以有多个购物车项），用hasMany
 *    例如：Goods.hasMany(Cart) → 商品可以出现在多个购物车项中（符合实际业务）
 */
Cart.belongsTo(Goods, {
  foreignKey: "goods_id", // 指定外键字段为goods_id，与模型中定义的字段对应
  as: "goods_info", // 自定义zd_goods表在关联查询时的别名为goods_info，方便获取商品详情
});

// 导出模型
module.exports = Cart;
